import { ChangeStatus, ChangeType } from '../constants/change';
import { request, type Response } from '../http';

export function getTripsList(payload: { status: number; page: number; page_size: number }) {
  return request.post('/api/home/reserveList', payload);
}

export function getTripDetails(id: string | number) {
  return request.post('/api/home/reserveDetail', { id });
}

/**
 * 获取房间号
 * @param {number} id 订单ID
 */
export function getRoomNumber(id: number) {
  return request.post<
    Response<{
      /**
       * 房间号
       */
      roomNo: number;
    }>
  >('/api/home/findReservationRoomNo', {
    id
  });
}

/**
 * 申请续住
 * @param {number} orderId 订单ID
 * @param {number} nightNum 续住天数
 */
export function applyForStayOn(orderId: number, nightNum: number) {
  return request.post<{
    /**
     * 退房日期
     */
    checkOutDate: string;

    /**
     * 封面
     */
    cover: string;

    /**
     * 房型名称
     */
    name: string;

    /**
     * 预计每晚价格
     */
    basePrice: number;

    /**
     * 库存量
     */
    inventory: number;

    /**
     * 预订单号
     */
    preOrderSn: string;

    /**
     * 最大可入住天数
     */
    maxStayNoDays: number;
  }>('/api/changeOrder/stayOn', {
    orderId,
    nightNum
  });
}

/**
 * 获取可变更信息
 * @param {number} orderId 订单ID
 */
export function getChangeableSettings(orderId: number) {
  return request.post<{
    /**
     * 系统订单号
     */
    orderSn: string;

    /**
     * 是否变更入住人信息
     * @value [Y] 是
     * @value [N] 否
     */
    isChangeGuest: string;

    /**
     * 入住人信息变更ID
     */
    isChangeGuestId: number;

    /**
     * 是否变更入住人数
     * @value [Y] 是
     * @value [N] 否
     */
    isChangePeople: string;

    /**
     * 入住人数信息变更ID
     */
    isChangePeopleId: number;

    /**
     * 是否变更入住日期
     * @value [Y] 是
     * @value [N] 否
     */
    isChangeDate: string;

    /**
     * 入住日期变更ID
     */
    isChangeDateId: number;

    /**
     * 住宿人编号
     */
    mainGuest: number;

    /**
     * 住宿人信息
     * @property {string} fullName 全名
     * @property {string} email 邮箱
     * @property {string} phone 电话
     * @property {string} areaNo 区号
     * @property {string} uid 三方系统ID
     */
    mainGuestDetail: object;

    /**
     * 入住日期
     */
    checkinDate: string;

    /**
     * 退房日期
     */
    checkoutDate: string;

    /**
     * 成人数量
     */
    adultCount: number;

    /**
     * 儿童数量
     */
    childCount: number;

    /**
     * 婴儿数量
     */
    infantCount: number;

    /**
     * 入住状态
     * @value [before_checkin] 在入住之前[显示取消订单，三种操作菜单根据状态显示操作]
     * @value [checked_in] 已入住[显示续住，三种操作都不可变更禁用]
     * @value [checked_out]  已退房[任何按钮都不能操作]
     */
    checkinStatus: string;

    /**
     * 是否可继续变更
     * @value [false] 不可变更
     * @value [true] 可变更
     */
    isNextChange: boolean;

    /**
     * 是否可变更日期
     * @value [false] 不可变更
     * @value [true] 可变更
     */
    isNextDateChange: boolean;

    /**
     * 是否可取消订单
     * @value [false] 不可取消
     * @value [true] 可取消
     */
    isCancelOrder: boolean;

    /**
     * 是否可续住
     * @value [false] 不可续住
     * @value [true] 可续住
     */
    isStayOn: boolean;
  }>('/api/changeOrder/options', {
    orderId
  });
}

/**
 * 获取已变更订单详情
 * @param {string} changeOrderSn 变更订单号
 */
export function getChangedOrderDetails(changeOrderSn: string) {
  return request.post<
    Response<{
      /**
       * 主键ID
       */
      id: number;

      /**
       * 变更订单号
       */
      changeOrderSn: string;

      /**
       * 订单ID
       */
      orderId: number;

      /**
       * 预订订单号
       */
      orderSn: string;

      /**
       * 预订外部订单号
       */
      outOrderSn: string;

      /**
       * 变更内容
       */
      changeType: ChangeType;

      /**
       * 旧入住日期
       */
      oldCheckinDate: string;

      /**
       * 旧退房日期
       */
      oldCheckoutDate: string;

      /**
       * 入住日期
       */
      newCheckinDate: string;

      /**
       * 退房日期
       */
      newCheckoutDate: string;

      /**
       * 旧成人数量
       */
      oldAdultCount: number;

      /**
       * 成人数量
       */
      newAdultCount: number;

      /**
       * 旧儿童数量
       */
      oldChildCount: number;

      /**
       * 儿童数量
       */
      newChildCount: number;

      /**
       * 旧婴儿数量
       */
      oldInfantCount: number;

      /**
       * 婴儿数量
       */
      newInfantCount: number;

      /**
       * 变动状态
       */
      changeStatus: ChangeStatus;

      /**
       * 变动金额
       */
      changeAmount: number;

      /**
       * 提交变更时间
       */
      submitDate: string;

      /**
       * 变更成功时间
       */
      doneDate: string;

      /**
       * 原订单价格
       */
      oldOrderPrice: number;

      /**
       * 变更后订单价格
       */
      newOrderPrice: number;

      /**
       * 订单过期时间
       */
      expirationTime: string;

      /**
       * 订单创建时间
       */
      createdAt: string;

      /**
       * 订单支付倒计时秒
       */
      countdown: number;
    }>
  >('/api/changeOrder/infoDetail', {
    changeOrderSn
  });
}

/**
 * 获取预订人信息
 * @param {number} orderId 订单ID
 */
export function getBookerInfo(orderId: number) {
  return request.post<{
    /**
     * airhost订单ID
     */
    airhostOrderUuid: string;

    /**
     * 订单ID
     */
    orderId: number;

    /**
     * 名
     */
    firstName: string;

    /**
     * 姓
     */
    lastName: string;

    /**
     * 邮箱
     */
    email: string;

    /**
     * 电话
     */
    phone: string;

    /**
     * 区号
     */
    areaNo: string;
  }>('/api/changeOrder/findGuestInfo', {
    orderId
  });
}

type UpdateBookerPayload = {
  /**
   * airhost订单ID
   */
  airhostOrderUuid: string;

  /**
   * 订单ID
   */
  orderId: number;

  /**
   * 名
   */
  firstName: string;

  /**
   * 姓
   */
  lastName: string;

  /**
   * 邮箱
   */
  email: string;

  /**
   * 电话
   */
  phone: string;

  /**
   * 区号
   */
  areaNo: string;
};

/**
 * 更新预订人信息
 * @param {UpdateBookerPayload} payload 预订人信息
 */
export function updateBookerInfo(payload: UpdateBookerPayload) {
  return request.post<{
    /**
     * airhost订单ID
     */
    airhostOrderUuid: string;

    /**
     * 订单ID
     */
    orderId: number;

    /**
     * 名
     */
    firstName: string;

    /**
     * 姓
     */
    lastName: string;

    /**
     * 邮箱
     */
    email: string;

    /**
     * 电话
     */
    phone: string;

    /**
     * 区号
     */
    areaNo: string;
  }>('/api/changeOrder/guestEdit', payload);
}

/**
 * 根据入住退房日期生成预变更订单
 * @param {number} orderId 订单ID
 * @param {string} checkInDate 入住日期
 * @param {string} checkOutDate 退房日期
 */
export function generatePreChangeOrderByDate(
  orderId: number,
  checkInDate: string,
  checkOutDate: string
) {
  return request.post<{
    /**
     * 原入住日期
     */
    oldCheckInDate: string;

    /**
     * 原离店日期
     */
    oldCheckOutDate: string;

    /**
     * 新入住日期
     */
    newCheckInDate: string;

    /**
     * 新离店日期
     */
    newCheckOutDate: string;

    /**
     * 房型名称
     */
    roomName: string;

    /**
     * 房间数量
     */
    roomNumber: number;

    /**
     * 免费取消日期提示
     */
    cancelDate: string;

    /**
     * 原订单价格
     */
    oldOrderPrice: number;

    /**
     * 新订单价格
     */
    newOrderPrice: number;

    /**
     * 订单价格差
     */
    diffOrderPrice: number;

    /**
     * 支付订单号
     */
    transactionSn: string;

    /**
     * 创建订单时间
     */
    createOrderTime: string;

    /**
     * 订单支付倒计时秒
     */
    countdown: number;

    /**
     * 变更订单号
     */
    changeOrderSn: string;
  }>('/api/changeOrder/datePreInfo', {
    orderId,
    checkInDate,
    checkOutDate
  });
}

/**
 * 根据入住退房日期确认预变更订单
 * @param {string} changeOrderSn 变更订单号
 */
export function confirmPreChangeOrderByDate(changeOrderSn: string) {
  return request.post<{
    /**
     * 变更订单号
     */
    changeOrderSn: string;

    /**
     * 订单支付倒计时秒
     */
    countdown: number;

    /**
     * 订单价格差
     */
    diffOrderPrice: number;

    /**
     * 支付订单号
     */
    transactionSn: string;

    /**
     * 创建订单时间
     */
    createOrderTime: string;
  }>('/api/changeOrder/datePreInfoSubmit', {
    changeOrderSn
  });
}

/**
 * 获取入住人数
 * @param {number} orderId 订单ID
 */
export function getNumberOfCheckInGuests(orderId: number) {
  return request.post<{
    /**
     * 成人数量
     */
    adult: number;
    /**
     * 儿童数量
     */
    child: number;
    /**
     * 婴儿数量
     */
    infant: number;
    /**
     * 占用
     */
    occupancy: number;
  }>('/api/changeOrder/bookingPeopleInfo', {
    orderId
  });
}

/**
 * 根据入住人数生成预变更订单
 * @param {string} orderId 订单ID
 * @param {number} adult 成人数量
 * @param {number} child 儿童数量
 * @param {number} infant 婴儿数量
 */
export function generatePreChangeOrderByGuests(
  orderId: number,
  adult: number,
  child: number,
  infant: number
) {
  return request.post<{
    /**
     * 变更订单号
     */
    changeOrderSn: string;

    /**
     * 支付订单号
     */
    transactionSn: string;

    /**
     * 变更价格
     */
    changePrice: number;

    /**
     * 原订单价格
     */
    oldOrderPrice: number;

    /**
     * 订单价格
     */
    orderPrice: number;

    /**
     * 创建订单时间
     */
    createOrderTime: string;

    /**
     * 订单支付倒计时秒
     */
    countdown: number;
  }>('/api/changeOrder/bookingPeople', {
    orderId,
    adult,
    child,
    infant
  });
}

/**
 * 根据入住人数确认预变更订单
 * @param {string} changeOrderSn 变更订单号
 */
export function confirmPreChangeOrderByGuests(changeOrderSn: string) {
  return request.post<{
    /**
     * 变更订单号
     */
    changeOrderSn: string;

    /**
     * 支付订单号
     */
    transactionSn: string;

    /**
     * 变更价格
     */
    changePrice: number;

    /**
     * 创建订单时间
     */
    createOrderTime: string;

    /**
     * 订单支付倒计时秒
     */
    countdown: number;
  }>('/api/changeOrder/bookingPeopleSubmit', {
    changeOrderSn
  });
}
